﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using Client.XML;
using Client.Common;
using System.Timers;
using System.Threading.Tasks;
using System.Threading;
using Common;

namespace SuperviseService
{
    public partial class FamilyContolSupervise : ServiceBase
    {
        public FamilyContolSupervise()
        {
            InitializeComponent();
        }

        private System.Timers.Timer timerSS = null;
        protected override void OnStart(string[] args)
        {
            try {
                // 初始化注册表值
                RegEditor.InitReg();
                Supervise();
                // 设置轮询事件
                this.timerSS = new System.Timers.Timer();
                this.timerSS.Interval = 1000 * 60;
                this.timerSS.Elapsed += new ElapsedEventHandler(timerSS_Elapsed);
                this.timerSS.Start();
            }
            catch (Exception ex) {
                FCLogger.WriteError(ex);
            }
        }

        void timerSS_Elapsed(object sender, ElapsedEventArgs e) {
            try {
                Supervise();
            }
            catch (Exception ex) {
                FCLogger.WriteError(ex);
            }
        }

        /// <summary>
        /// 监督电脑使用情况
        /// </summary>
        private void Supervise() {
            FCLogger.WriteInfo("进入监督");
            DayPlan plan = null;
            // 存在今天的计划
            if (Helper.HasPlanedToday(Helper.GetPlanList(), out plan)) {
                FCLogger.WriteInfo("存在今天的日志");
                bool isAllowUsePC = false;
                var items = plan.PlanItems.Where(pi => pi.AllowUsePC == "1");
                // 存在今天的允许使用电脑的计划（然后判断现在的时间是否是属于此计划时间段）
                if (items.Count() > 0) {
                    List<PlanItem> lst = items.ToList();

                    foreach (var item in lst) {
                        DateTime startDateTime;
                        DateTime endDateTime;
                        if (DateTimeTryParse(item.StartTime, out startDateTime) &&
                            DateTimeTryParse(item.EndTime, out endDateTime)) {
                            if (startDateTime.Ticks <= DateTime.Now.Ticks
                                && DateTime.Now.Ticks <= endDateTime.Ticks) {
                                isAllowUsePC = true;
                                FCLogger.WriteInfo("是在使用电脑期间");
                                break;
                            }
                        }
                    }
                    // 现在不是可以使用电脑的时间段
                    if (!isAllowUsePC) {
                        this.StartUpForm(false);
                    }
                }
                // 有计划，但是没有使用电脑的计划
                else {
                    this.StartUpForm(false);
                }
            }
            // 不存在今天的计划
            else {
                this.StartUpForm(true);
            }
        }

        /// <summary>
        /// 启动窗体
        /// </summary>
        /// <param name="pIsMainForm"></param>
        private void StartUpForm(bool pIsMainForm) {
            string fileName = string.Empty;
            // 启动主窗体
            if (pIsMainForm) {
                FCLogger.WriteInfo("不存在今天的计划，设定");
                // 防止重复产生窗体
                if (Process.GetProcessesByName("FCClient").Count() == 0) {
                    fileName = @"D:\MyWorkspace\教育\FamilyCorperate\Code\Client\bin\Debug\FCClient.exe";
                    // 运行页面
                    ProcessAsUser.Launch(fileName);
                }
            }
            // 启动锁屏
            else {
                FCLogger.WriteInfo("存在今天的日志,但是现在不允许用电脑");

                // 如果已经存在,尝试杀掉进程，防止恶意重名进程
                if (Process.GetProcessesByName("FCClientLocker").Count() > 0) {
                    // do nothing
                }
                else {
                    fileName = @"D:\MyWorkspace\教育\FamilyCorperate\Code\ClientLocker\bin\Debug\FCClientLocker.exe";
                    // 运行页面
                    ProcessAsUser.Launch(fileName);
                }
            }
        }

        private bool DateTimeTryParse(string pStrTime, out DateTime pDateTime) {
            string strDateTime = string.Format("{0} {1}",
                            DateTime.Now.ToString("yyyy-MM-dd"), pStrTime);
            return DateTime.TryParse(strDateTime, out pDateTime);
        }

        protected override void OnStop() {

        }
    }
}
